本身從11月初開始接觸move語言,在比較傳統move與sui move之後,決定從sui move直接學習。
但因為sui move還在開發初期,所以能找到的資料有限,教學基本上是沒有,除了官網,以及最近Buildler DAO的代幣生成的教程,學習資源不多,所以自己也爬文爬來爬去,透過官網及零湊的資料做學習。
本身對程式語言只有一點點基礎,加上英文不好,學習起來蠻吃力的。
如果大家有興趣,歡迎一起來研究,目前臺灣這方面的資源極少。
若是想學習aptos move語言,也就是原先的move,目前已經有不少大神已開發出教程,有興趣的可以底下留言,我在提供連結。
---前言---
這篇沒有教如何搭載編譯環境,有興趣可以到官網去看。
若有問題,歡迎私訊。
---進入正題--- (我有開始撰寫教程,可以前往我的發文)
以下這個三明治組合製作,是我爬到一位大神所發表的文章,他的文章是9月底的時候發的,中間應該因為經過多次改版,所以編碼有許多地方有變動,這邊我附上原文,以及我修改後的版本,提供參考學習,他的文章很好,記得詳閱。
原文:https://medium.com/dsrv/my-first-impression-of-sui-move-1-introduction-minting-a-simple-nft-f8e27941446e
簡中:https://learnblockchain.cn/article/4812
建議先看他的教學,照著他的程式碼完成一次,再來我這邊做比較,尋找修改的地方。
以下我就不詳細講太多東西,可以比較看看修改了哪些地方,因為不知道有沒有人看,有需要再提問XD 。
module sandwich::shop {
use sui::object::{Self,UID};
use sui::tx_context::{Self, TxContext};
use sui::transfer;
use sui::balance::{Self, Balance};
use sui::sui::SUI;
use sui::coin::{Self, Coin};
struct Ham has key { id:UID }
struct Bread has key { id:UID }
struct Sandwich has key { id:UID }
struct GroceryOwnerCapability has key { id:UID }
struct Grocery has key { id:UID, profits:Balance<SUI> }
const HAM_PRICE: u64 = 10;
const BREAD_PRICE: u64 = 2;
const EInsufficientFunds: u64 = 0;
const ENoProfits: u64 = 1;
fun init(ctx: &mut TxContext) {
transfer::share_object(Grocery{id:object::new(ctx),
profits:balance::zero<SUI>()});
transfer::transfer(GroceryOwnerCapability{id:object::new(ctx)},
tx_context::sender(ctx));
}
public entry fun buy_ham(grocery: &mut Grocery,c: Coin<SUI>,ctx: &mut TxContext) {
let b = coin::into_balance(c);
assert!(balance::value(&b) == HAM_PRICE, EInsufficientFunds);
balance::join(&mut grocery.profits, b);
transfer::transfer( Ham{id: object::new(ctx)}, tx_context::sender(ctx))
}
public entry fun buy_bread (grocery: &mut Grocery,c: Coin<SUI>,ctx: &mut TxContext)
{
let b = coin::into_balance(c);
assert!(balance::value(&b) == BREAD_PRICE, EInsufficientFunds);
balance::join( &mut grocery.profits, b);
transfer::transfer(Bread {id: object::new(ctx)}, tx_context::sender(ctx))
}
public entry fun make_sandwish(ham:Ham, bread:Bread, ctx: &mut TxContext) {
let Ham { id: ham_id } = ham;
let Bread { id:bread_id } = bread;
object::delete(ham_id);
object::delete(bread_id);
transfer::transfer(Sandwich{id: object::new(ctx)}, tx_context::sender(ctx))
}
public fun profits(grocery: &Grocery): u64 {
balance::value( & grocery.profits)
}
public entry fun collect_profits(_cap: & GroceryOwnerCapability,
grocery: &mut Grocery, ctx: &mut TxContext) {
let amount = balance::value( & grocery.profits);
assert!(amount > 0, ENoProfits);
let coin = coin::take( &mut grocery.profits, amount, ctx);
transfer::transfer(coin, tx_context::sender(ctx));
}
#[test_only]
public fun init_for_testing(ctx: &mut TxContext){
transfer::share_object(Grocery{id:object::new(ctx), profits:balance::zero<SUI>
()});
transfer::transfer(GroceryOwnerCapability
{id:object::new(ctx)},tx_context::sender(ctx));
}
}
#[test_only]
module sandwich::test_sandwish {
use sandwich::shop::{Self,Grocery,GroceryOwnerCapability,Bread,Ham};
use sui::test_scenario;
use sui::coin;
use sui::sui::SUI;
#[test]
fun test_make_sandwish() {
let owner = @0x1;
let the_guy = @0x2;
let scenario_val = test_scenario::begin(owner);
let scenario = &mut scenario_val;
test_scenario::next_tx(scenario, owner); {
shop::init_for_testing(test_scenario::ctx(scenario));
};
test_scenario::next_tx(scenario, the_guy); {
let grocery_wrapper = test_scenario::take_shared<Grocery>(scenario);
let ctx = test_scenario::ctx(scenario);
shop::buy_ham(&mut grocery_wrapper, coin::mint_for_testing<SUI>(10, ctx),ctx);
shop::buy_bread(&mut grocery_wrapper, coin::mint_for_testing<SUI>(2, ctx),ctx);
test_scenario::return_shared(grocery_wrapper);
};
test_scenario::next_tx(scenario, the_guy); {
let ham = test_scenario::take_from_address<Ham>(scenario, the_guy);
let bread = test_scenario::take_from_address<Bread>(scenario, the_guy);
shop::make_sandwish(ham, bread, test_scenario::ctx(scenario));
};
test_scenario::next_tx(scenario, owner); {
let grocery_wrapper = test_scenario::take_shared<Grocery>(scenario);
let grocery = &mut grocery_wrapper;
let capability = test_scenario::take_from_address< GroceryOwnerCapability>(scenario, owner);
assert!(shop::profits(grocery) == 12,0);
shop::collect_profits( &capability, grocery,test_scenario::ctx(scenario));
assert!(shop::profits(grocery)==0, 0);
test_scenario::return_to_sender(scenario, capability);
test_scenario::return_shared(grocery_wrapper);
};
test_scenario::end(scenario_val);
}
}
另外關於init初始化權限這部分,為什麼init for test不直接寫入init(ctx),是因為目前0.16版本,官方為了防止測試有問題,所以暫時關閉了init的測試功能,如果使用之後去test,系統會報錯,所以把init的編碼直接搬到init for test裡。
請教一個愚蠢的問題
學會 sui move 可以寫什麼
可以簡單回覆
專有名詞(eg.Smart Contract...)我再去Google就好
我對虛擬貨幣完全外行(只聽過「去中心化」「比特幣」「以太幣」)
看了您這篇文章
才去Google了 sui move
您好,是寫智能合約唷~
去中心主要是建構在[以太坊]這樣的區塊鏈平台上,在以太坊上可以建構許多Dapp,如前陣子很紅的NFT交易平台opensea就是以太坊上的項目(Dapp)之一,這些平台上的項目,後端都是透過智能合約去寫的。
不過目前區塊鏈都是用「solidity」的程式語言去寫的,而move是FB(Meta)原本團隊所另外開發的智能合約語言。
後來團隊拆了,裡面一些人出來創立sui區塊平台,他們針對move進行優化,開發了sui move這樣的特有程式語言。
簡單講是這樣,哈哈~
可能可以先去了解區塊鏈的架構及應用,會比較理解!
有點概念了
如果對區塊鏈有興趣,想多了解,歡迎可以到我創的line社群唷,我有把連結放在下一篇文章中。